#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include "comm.h"

using namespace std;

// 创建命名管道
bool MakeFifo()
{
    int n = mkfifo(FILENAME, 0666);
    if (n < 0)
    {
        cerr << "errno" << errno << "strerror" << strerror(errno) << endl;
        return false;
    }
    cout << "create fifo success..." << endl;
    return true;
}

int main()
{
Start:
    int rfd = open(FILENAME, O_RDONLY);
    // 有命名管道直接打开，没有则创建，创建完后还需要再一次打开管道
    if (rfd < 0)
    {
        cerr << "errno:" << errno << "  strerror:" << strerror(errno) << endl;
        if (MakeFifo())
            goto Start;
        else
            return 1;
    }
    cout << "open fifo success... read" << endl;

    while (1)
    {
        cout << "Client Say# ";
        char buffer[1024];
        // 将管道中的数据读入到缓冲区中
        ssize_t num = read(rfd, buffer, sizeof(buffer) - 1);
        // 我们默认向管道中写入的是字符串，所以需要在结尾处加上0
        if (num > 0)
        {
            buffer[num] = 0;
        }
        // num == 0 代表写端已经关闭，读端也没必要存在了，关闭读端
        else if (num == 0)
        {
            cout << endl;
            cout << "client close , server close too..." << endl;
            break;
        }
        cout << buffer << endl;
    }

    close(rfd);
    cout << "close fifo success...read" << endl;

    return 0;
}